package model.Usuario;
import java.util.ArrayList;
import java.util.List;

import model.Publicacion.Pregunta;
import model.Publicacion.Publicacion;
import model.Publicacion.Respuesta;
import model.insigniaYlogros.Insignia;
import model.insigniaYlogros.Logro;
import model.sistema.Sistema;

import org.joda.time.DateTime;




public abstract class UsuarioRegistrado extends Usuario
{
	
	
	protected String nombre;
	
	protected String email;
	
	protected DateTime fechaRegistro;
	
	protected List<Pregunta> preguntas;
	
	protected Sistema sistema;
	protected List<Insignia> insigniasGanadas;
	
	public UsuarioRegistrado(Sistema sist,String nombre,String email){
		super();
		this.preguntas=new ArrayList<Pregunta>();
		this.fechaRegistro=DateTime.now();
		this.nombre=nombre;
		this.email=email;
		this.sistema=sist;
		this.insigniasGanadas=new ArrayList<Insignia>();
	}
	
	public String getNombre() {
		
		return nombre;	
	}
	
	public String getEmail() {
		
		return email;	
	}
	
	public DateTime getFecha() {
		
		return fechaRegistro;	
	}
	
	
	public void hacerPregunta(Pregunta p) {
		
			preguntas.add(p);
			sistema.agregarPregunta(p);
	}
	
	

	
	public abstract  double factorDeRegularidad();
	
	
	public boolean algunaPublicacionRealizadaEnMes(int i) {
		
		boolean cumple =false;
		for(Pregunta p:preguntas)
		{
			if(p.getFecha().getMonthOfYear()==i)
			{
				cumple=true;
			}
		}
		for(Respuesta r:respuestas)
		{
			if(r.getFecha().getMonthOfYear()==i)
			{
				cumple=true;
			}
		}
		return cumple;
	}

	public List<Pregunta> getPreguntas()
	{
		return preguntas;
	}
	public void borrarPregunta(Pregunta p)
	{
		p.eliminar();
	}
	@Override
	public List<Publicacion> getPublicaciones() {
		
		List<Publicacion> lista=new ArrayList<Publicacion>();
		lista.addAll(preguntas);
		lista.addAll(respuestas);
		return lista;
	}

	public int cantidadDePreguntas() {
		int cantidad=0;
		for(Pregunta p:preguntas)
		{
			if(!p.estaEliminada())
			{
				cantidad++;
			}
		}
		
		return cantidad;
	}
	@Override
	public double ranking() {
		
		 sistema.actualizarInsigniasPara(this);
		return super.ranking();
	}

	public void agregarInsignia(Insignia i) {
		insigniasGanadas.add(i);
	}

	public boolean noContieneInsignia(Insignia i) {
		
		return !insigniasGanadas.contains(i);
	}
	
	public List<Logro> logrosFaltantesPara(Insignia insignia)
	{
		return insignia.getLogrosRestantePara(this);
	}
	public List<Logro> logrosConseguidosPara(Insignia insignia)
	{
		return insignia.getLogrosConseguidosPara(this);
	}
	
}

